package com.cskaoyan.javase.oop2._1extends._2conversion;

import javafx.geometry.VPos;

/**
 * 引用数据类型的类型转换
 * 1.首先思考一个问题,引用数据类型包含两个部分,有两个类型:
 *      1.引用的类型
 *      2.对象的类型
 *  引用数据类型的类型转换,转换的是什么的类型呢?
 *  转换的是引用的数据类型
 *
 * 2.引用数据类型,要想发生类型转换,有没有前提?是任意两个类之间都能类型转换吗?
 *  引用数据类型的类型转换,必须发生在具有继承关系的父子类之间
 *  如果两个类没有父子关系,那么它们不能发生类型转换(不能通过编译)
 *  继承的优点:
 *          继承打破了Java引用数据类型的类型限制
 *          使得引用数据类型出现了类型转换,没有继承,引用数据类型就没有类型转换
 *
 * 3.引用数据类型的类型转换,和基本数据类型的类型转换一样,也分成两大类:
 *      a.自动类型转换,无需程序员写额外代码，编译器自动完成类型转换。
 *      b.强制类型转换,需要程序员写额外代码强制完成的类型转换。
 *
 * 4.引用数据类型的自动类型转换:
 *      a.发生条件
 *      类似于:
 *      Father fs = new Son();
 *      这种格式,其实就是把子类引用转换成了父类引用
 *      这里没有写额外代码
 *      这里存在引用数据类型的自动类型转换
 *      所以
 *      引用数据类型的自动类型转换条件是:
 *      子类引用 --> 父类引用
 *      之所以这里能够直接类型转换,是因为
 *      子类 "is-a" 父类
 *      子类本身就可以当父类用,所以这里是自动类型转换
 *
 *      b.特殊称呼,引用数据类型的自动类型转换,有点太长了,拗口,所以
 *      我们根据类型转换在继承中的方向
 *      从子类引用 --> 父类引用
 *      在继承方向上属于 从下往上
 *      称之为"向上转型"
 *
 * 5.引用数据类型的强制类型转换:
 *      a.发生的条件
 *      与引用数据类型的自动类型转换相对应
 *      把
 *      父类引用 ---> 子类引用
 *      就是强制类型转换
 *      语法:
 *      子类引用 = (子类类名)父类引用;
 *      只要符合上述语法
 *      把父类引用转换成子类引用
 *      都是可以正常通过编译的
 *
 *      b.成功的条件:
 *      父类引用 ---> 子类引用
 *      相当于把父类当成子类使用
 *      这在绝大多数情况下都不可能
 *      一旦做强转,很容易就出现报错
 *      所以引用数据类型的强制类型转换
 *      要想成功条件是很苛刻的
 *      这里我们先不讲(先铺垫一下)
 *
 *      c.特殊称呼
 *      引用数据类型的强制类型转换
 *      继承方向来说是从上到下的
 *      属于"向下转型"
 *
 *
 *
 *
 * @since 15:36
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 创建iPhone对象,用Phone引用指向,父类引用指向子类对象
        Phone p = new IPhone();

        // 以上代码实际上是等价于
        IPhone ip = new IPhone();
        Phone pp;
        /*
            把子类的引用直接赋值给父类引用,相当于改变了引用的类型
            这个过程其实就是引用数据类型的类型转换
            将子类引用转换成父类引用
         */
        pp = ip;
        System.out.println("---------------------");
        Father f = new Father();
        Son s = (Son) f;

    }
}

class Father{}

class Son extends Father{}
class Phone {
    double price;
    String brand;
    String model;

    public void call() {
        System.out.println("手机打电话!");
    }
}

class IPhone extends Phone {
    public void playGame() {
        System.out.println("玩切西瓜!");
    }
}

